import store from '@/store'
import axios from 'axios'
import { Message } from 'element-ui'
import router from '../router'

// 创建引入lujing
const service = axios.create({
  // 看到这段话process.env.VUE_APP_BASE_API,就知道是在 .env.development 文件中配置的
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout
})

// 请求拦截器
// 设置请求头
service.interceptors.request.use(config => {
  // 统一设置token
  if (store.getters.token) {
    const loginTime = localStorage.getItem('loginTime')
    const time = Date.now()
    // 超过多长时间算超时
    const timeOut = 10000000
    // 判断如果超时,就弹出提示
    if (time - loginTime > timeOut) {
      // 调用退出的actions
      store.dispatch('user/logout')
      // 跳转到登录
      router.push('/login')
      return Promise.reject(new Error('你已超时'))
    } else {
      // 如果不超时才设置请求头
      // 请求头一般要写成Bearer+[空格]+token形式
      config.headers.Authorization = `Bearer ${store.getters.token}`
    }
  }
  return config
})

// 响应拦截器
// 在响应拦截中,做数据的判断
service.interceptors.response.use(res => {
  console.log(18, res)
  // 网络层面的成功
  // 把data从res.data里面结构出来
  const { success, data, message } = res.data
  // 判断响应的结果
  if (success) {
    // 数据方面的成功
    return data
  } else {
    // 数据层面的失败
    Message.error(message)
    // Promise.reject 停止当前的请求,并使用new Error返回错误信息
    // 如果使用new Error就能提示在第几行报错
    return Promise.reject(new Error(message))
  }
}, err => {
  // 网络方面失败
  console.dir(err)
  // 被动处理token失效
  // 判定条件是和后端共同协商的,一般是这个
  if (err.response && err.response.data.code === 10002) {
    store.dispatch('user/logout')
    router.push('/login')
  }
  // 网络层面的失败
  Message.error(err.message)
  return Promise.reject(new Error(err.message))
})

// 暴露
export default service
